import 'reflect-metadata'

function logged(value, context) {
  console.log('value ', value)
  console.log('context ', context)
}

// @logged // 类装饰器 kind = class
// class C {}

// class C {
//   @logged // 方法装饰器 kind = method
//   say() {}
// }

// class C {
//   @logged // 访问器装饰器 kind = getter
//   get a() {
//     return 1
//   }
// }

// class C {
//   @logged // 访问器装饰器 kind = setter
//   set a(val) {
//   }
// }

// class C {
//   @logged // 属性装饰器 kind = field
//   a : number;
// }


// class C {
//   @logged // 自动访问器装饰器 kind = accessor
//   accessor a = 1
// }
// const c = new C
// console.log(c.a)
// c.a = 2
// console.log(c.a)
// 自动访问器会被转换成
// class C {
//   #a = 1
//   get a() {
//     return this.#a;
//   }
//   set x(val) {
//     this.#a = val;
//   }
// }


// class C {
//   // 静态属性 需要通过类来访问 context.static = true
//   @logged
//   static a: number
// }
// console.log(C.a)



// class C {
//   // 实例属性 需要通过实例对象来访问
//   @logged
//   a : number
// }
// const c = new C()
// console.log(c.a)


class C {
  // 私有属性 只能在类中访问
  @logged
  private _a = 1

  get a() {
    return this._a
  }
  set a (val) {
    this._a = val
  }
}
const c = new C()
console.log(c.a)


export {} // 使用 export 该文件独立成为一个模块